package com.dys.testio05;

import java.io.*;

/**
 * @className: src.main.java.com.dys.testio05.BufferedReaderAndWriter
 * @description: 缓冲字符流(处理流)-BufferedReader,BufferedWriter完成文本文件的复制
 * @author: pine cone
 * @version: v1.0.0
 * @createTime: 2024/08/15 下午10:25
 */
public class BufferedReaderAndWriter {

    /**
     * 这是一个main()方法,是应用程序的入口
     *
     * @param args 方法的形参列表,是一个字符串数组,包含了从命令行传递给程序的参数
     */
    public static void main(String[] args) throws IOException {
        new BufferedReaderAndWriter().oneCharRead();
    }

    /**
     * 一个字符一个字符的写
     *
     * @throws IOException
     */
    public void oneCharRead() throws IOException {
        // 1.有一份源文件
        File f1 = new File("E:\\test.txt");
        // 2.有一份目标文件
        File f2 = new File("E:\\Demo.txt");
        // 3.有一根管 怼到 源文件
        FileReader fr = new FileReader(f1);
        // 4.有一根管 怼到 目标文件
        FileWriter fw = new FileWriter(f2);
        // 5.套一根管在输入字符流外面
        BufferedReader br = new BufferedReader(fr);
        // 6.套一根管在输出字符流外面
        BufferedWriter bw = new BufferedWriter(fw);
        // 7.开始复制
        long startTime = System.currentTimeMillis();
        int n = br.read();
        while (n != -1) {
            bw.write(n);
            n = br.read();
        }
        long endTime = System.currentTimeMillis();
        System.out.println("复制文本文件所用时间：" + (endTime - startTime) + "ms");
        // 8.关流
        bw.close();
        br.close();
        fw.close();
        fr.close();
    }

    /**
     * 利用缓冲字符数组进行读取
     *
     * @throws IOException
     */
    public void bufferArrayRead() throws IOException {
        // 1.有一份源文件
        File f1 = new File("E:\\test.txt");
        // 2.有一份目标文件
        File f2 = new File("E:\\Demo.txt");
        // 3.有一根管 怼到 源文件
        FileReader fr = new FileReader(f1);
        // 4.有一根管 怼到 目标文件
        FileWriter fw = new FileWriter(f2);
        // 5.套一根管在输入字符流外面
        BufferedReader br = new BufferedReader(fr);
        // 6.套一根管在输出字符流外面
        BufferedWriter bw = new BufferedWriter(fw);
        // 7.开始复制
        long startTime = System.currentTimeMillis();
        char[] buf = new char[20];
        int len = br.read(buf);
        while (len != -1) {
            bw.write(buf, 0, len);
            len = br.read(buf);
        }
        long endTime = System.currentTimeMillis();
        System.out.println("缓冲数组复制文本文件所用时间：" + (endTime - startTime) + "ms");
        // 8.关流
        bw.close();
        br.close();
        fw.close();
        fr.close();
    }

    /**
     * 读取String
     *
     * @throws IOException
     */
    public void stringRead() throws IOException {
        // 1.有一份源文件
        File f1 = new File("E:\\test.txt");
        // 2.有一份目标文件
        File f2 = new File("E:\\Demo.txt");
        // 3.有一根管 怼到 源文件
        FileReader fr = new FileReader(f1);
        // 4.有一根管 怼到 目标文件
        FileWriter fw = new FileWriter(f2);
        // 5.套一根管在输入字符流外面
        BufferedReader br = new BufferedReader(fr);
        // 6.套一根管在输出字符流外面
        BufferedWriter bw = new BufferedWriter(fw);
        // 7.开始复制
        long startTime = System.currentTimeMillis();
        // 每次读取文件中的一行，返回字符串
        String s = br.readLine();
        while (s != null) {
            bw.write(s);
            // 在文本文件中应该再写出一个换行：新起一行
            bw.newLine();
            s = br.readLine();
        }
        long endTime = System.currentTimeMillis();
        System.out.println("缓冲数组复制文本文件所用时间：" + (endTime - startTime) + "ms");
        // 8.关流
        bw.close();
        br.close();
        fw.close();
        fr.close();
    }
}
